import numpy as np
import wave
import struct
import os

class MorseCodeAudio:
    def __init__(self, sample_rate=44100, frequency=800, dot_duration=0.1, dash_duration=0.3):
        self.sample_rate = sample_rate
        self.frequency = frequency
        self.dot_duration = dot_duration
        self.dash_duration = dash_duration
        self.silence_duration = 0.1
        
        # 摩尔斯码字典
        self.morse_dict = {
            'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.',
            'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..',
            'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.',
            'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',
            'Y': '-.--', 'Z': '--..', ' ': ' ', '.': '.-.-.-', ',': '--..--',
            '?': '..--..', '!': '-.-.--', '-': '-....-', '/': '-..-.', '(': '-.--.',
            ')': '-.--.-', '&': '.-...', ':': '---...', ';': '-.-.-.', '=': '-...-',
            '+': '.-.-.', '_': '..--.-', '"': '.-..-.', '$': '...-..-', '@': '.--.-.'
        }
    
    def generate_tone(self, duration):
        """生成指定持续时间的音调"""
        samples = int(duration * self.sample_rate)
        t = np.linspace(0, duration, samples, False)
        tone = np.sin(2 * np.pi * self.frequency * t)
        return tone
    
    def generate_silence(self, duration):
        """生成指定持续时间的静音"""
        samples = int(duration * self.sample_rate)
        return np.zeros(samples)
    
    def text_to_morse(self, text):
        """将文本转换为摩尔斯码"""
        morse_code = []
        for char in text.upper():
            if char in self.morse_dict:
                morse_code.append(self.morse_dict[char])
            else:
                morse_code.append(' ')
        return ' '.join(morse_code)
    
    def morse_to_audio(self, morse_code):
        """将摩尔斯码转换为音频"""
        audio_samples = []
        
        for char in morse_code:
            if char == '.':
                # 点
                audio_samples.extend(self.generate_tone(self.dot_duration))
                audio_samples.extend(self.generate_silence(self.silence_duration))
            elif char == '-':
                # 划
                audio_samples.extend(self.generate_tone(self.dash_duration))
                audio_samples.extend(self.generate_silence(self.silence_duration))
            elif char == ' ':
                # 字符间间隔
                audio_samples.extend(self.generate_silence(self.silence_duration * 3))
            elif char == '/':
                # 单词间间隔
                audio_samples.extend(self.generate_silence(self.silence_duration * 7))
        
        return np.array(audio_samples)
    
    def save_audio(self, audio_data, filename):
        """保存音频为WAV文件"""
        # 确保音频数据在-1到1之间
        audio_data = np.clip(audio_data, -1, 1)
        
        # 转换为16位整数
        audio_data = (audio_data * 32767).astype(np.int16)
        
        with wave.open(filename, 'w') as wav_file:
            wav_file.setnchannels(1)  # 单声道
            wav_file.setsampwidth(2)  # 16位
            wav_file.setframerate(self.sample_rate)
            wav_file.writeframes(audio_data.tobytes())
        
        print(f"音频文件已保存: {filename}")

def main():
    # 创建摩尔斯码音频生成器
    morse_audio = MorseCodeAudio()
    
    # 读取摩尔斯码文件
    with open('morse_codes.txt', 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 分离摩尔斯码部分（在翻译内容之前的部分）
    morse_section = content.split('==========================================')[0].strip()
    morse_lines = [line.strip() for line in morse_section.split('\n') if line.strip()]
    
    # 为每行摩尔斯码生成音频
    for i, morse_line in enumerate(morse_lines):
        if morse_line:  # 跳过空行
            print(f"处理第 {i+1} 行摩尔斯码: {morse_line}")
            
            # 生成音频
            audio_data = morse_audio.morse_to_audio(morse_line)
            
            # 保存音频文件
            filename = f"morse_line_{i+1:02d}.wav"
            morse_audio.save_audio(audio_data, filename)
    
    # 生成完整的音频文件
    print("\n生成完整音频文件...")
    all_audio = []
    
    for i, morse_line in enumerate(morse_lines):
        if morse_line:
            audio_data = morse_audio.morse_to_audio(morse_line)
            all_audio.extend(audio_data)
            # 在每行之间添加较长间隔
            all_audio.extend(morse_audio.generate_silence(1.0))
    
    # 保存完整音频
    morse_audio.save_audio(np.array(all_audio), "complete_morse_audio.wav")
    
    print("\n所有音频文件生成完成！")
    print("生成的文件:")
    for i, morse_line in enumerate(morse_lines):
        if morse_line:
            print(f"  morse_line_{i+1:02d}.wav")
    print("  complete_morse_audio.wav (完整音频)")

if __name__ == "__main__":
    main() 